9.5 小结
- Go Web服务器本身是并发的,服务器会把接收到的每条请求都放到独立的goroutine里运行。
- 并发和并行是两个相辅相成的概念,但它们并不相同。并发指的是两个或多个任务在同一时间段内启动、运行和结束,并且这些任务可能会彼此互动,而并行则是单纯地同时运行多个任务。
- Go通过goroutine和通道这两个重要的特性直接支持并发,但Go并不直接支持并行。
- goroutine用于编写并发程序,而通道则用于为不同的goroutine之间提供通信功能。
- 无缓冲通道都是同步的,尝试向一个已经包含数据的无缓冲通道推入新的数据将被阻塞;但是,有缓冲通道在被填满之前都是异步的。
select
语句可以以先到先服务的方式,从多个通道里选出一个已经准备好执行接收操作的通道。WaitGroup
同样可以用于对多个通道进行同步。- 并发程序的性能一般都会比相应的非并发程序要高,而具体提升多少则取决于所使用的算法(即使在只使用一个CPU的情况下,也是如此)。
- 在条件允许的情况下,并发的Web应用将自动地获得并行带来的优势。
[1] 原书说Go 1.4 goroutine 的启动栈大小为8 KB,但根据资料,这个栈的大小应该是2 KB才对,所以在译文里面进行了修正。(资料链接:https://golang.org/doc/go1.4#runtime。)——译者注